#!/usr/bin/env python3
'''该代码启动一个ftp服务，其传输根目录是当前脚本下的data目录'''
import argparse
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler, TLS_FTPHandler
from pyftpdlib.servers import FTPServer
import os
script_dir = os.path.dirname(os.path.abspath(__file__))

def run_ftp_server(address, port, certfile=None, keyfile=None):
    # 实例化虚拟用户授权器
    authorizer = DummyAuthorizer()
    
    # 添加用户（实际使用时可以从配置文件或数据库读取）
    authorizer.add_user("user", "password", f'{script_dir}/data', perm="elradfmw")
    # authorizer.add_anonymous("/tmp")  # 可选匿名访问
    
    # 根据是否启用SSL选择不同的处理器
    if certfile and keyfile:
        handler = TLS_FTPHandler
        handler.certfile = certfile
        handler.keyfile = keyfile
        handler.tls_control_required = True
        handler.tls_data_required = True
        print(f"启用SSL/TLS加密 (证书: {certfile}, 密钥: {keyfile})")
    else:
        handler = FTPHandler
        print("未启用加密 (普通FTP)")
    
    handler.authorizer = authorizer
    handler.banner = "Python FTP Server"
    
    # 设置被动端口范围（可选）
    # handler.passive_ports = range(60000, 61000)
    
    server = FTPServer((address, port), handler)
    
    # 服务器设置
    server.max_cons = 256
    server.max_cons_per_ip = 5
    
    print(f"FTP服务器正在 {address}:{port} 运行...")
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        print("\n服务器正在关闭...")
        server.close_all()

def parse_args():
    parser = argparse.ArgumentParser(description='Python FTP服务器')
    parser.add_argument('-a', '--address', default='0.0.0.0',
                       help='监听地址 (默认: 0.0.0.0)')
    parser.add_argument('-p', '--port', type=int, default=2121,
                       help='监听端口 (默认: 2121)')
    parser.add_argument('-c', '--certfile',
                       help='SSL证书文件路径 (启用加密)')
    parser.add_argument('-k', '--keyfile',
                       help='SSL私钥文件路径 (启用加密)')
    return parser.parse_args()

def validate_args(args):
    if (args.certfile and not args.keyfile) or (args.keyfile and not args.certfile):
        raise ValueError("必须同时提供证书文件和密钥文件以启用加密")
    if args.certfile and args.keyfile:
        import os
        if not os.path.exists(args.certfile):
            raise FileNotFoundError(f"证书文件不存在: {args.certfile}")
        if not os.path.exists(args.keyfile):
            raise FileNotFoundError(f"密钥文件不存在: {args.keyfile}")

if __name__ == "__main__":
    args = parse_args()
    try:
        validate_args(args)
        run_ftp_server(args.address, args.port, args.certfile, args.keyfile)
    except Exception as e:
        print(f"错误: {e}")